package com.clei.utils.helper;

/**
 * 数据库辅助器
 *
 * @author Y
 * @date 2024-01-30
 **/
public abstract class DBHelper {

    /**
     * 默认java类型
     */
    private static final String DEFAULT_JAVA_TYPE = "java.lang.String";

    /**
     * getJavaType
     *
     * @param type columnType
     * @return javaType
     */
    public String getJavaType(String type) {
        // 全转为小写
        type = type.toLowerCase();
        // 去掉后面的括号
        int index = type.indexOf('(');
        if (-1 != index) {
            type = type.substring(0, index);
        }
        // 有空格的只取前面一部分 针对mysql unsigned类型，如[bigint unsigned]
        index = type.indexOf(' ');
        if (-1 != index) {
            type = type.substring(0, index);
        }
        // 结果
        return getJavaType(type, DEFAULT_JAVA_TYPE);
    }

    /**
     * exportStructure
     *
     * @param exportType 导出类型 1仅数据 2仅结构 3数据和结构
     * @return true/false
     */
    public boolean exportStructure(int exportType) {
        return (exportType & 2) == 2;
    }

    /**
     * exportData
     *
     * @param exportType 导出类型 1仅数据 2仅结构 3数据和结构
     * @return true/false
     */
    public boolean exportData(int exportType) {
        return (exportType & 1) == 1;
    }

    /**
     * getString
     *
     * @param obj obj
     * @return String
     */
    public String getString(Object obj) {
        if (null != obj) {
            String className = obj.getClass().getSimpleName();
            return getString(obj, className);
        }
        return "NULL";
    }

    /**
     * getStringForInsert
     *
     * @param obj obj
     * @return String
     */
    public String getStringForInsert(Object obj) {
        if (null != obj) {
            String className = obj.getClass().getSimpleName();
            return getStringWithSingleQuotation(obj, className);
        }
        return "NULL";
    }

    /**
     * getJavaType
     *
     * @param type        columnType
     * @param defaultType defaultType
     * @return javaType
     */
    abstract String getJavaType(String type, String defaultType);

    /**
     * getString
     *
     * @param obj       obj
     * @param className className
     * @return String
     */
    abstract String getString(Object obj, String className);

    /**
     * getStringWithSingleQuotation
     *
     * @param obj       obj
     * @param className className
     */
    abstract String getStringWithSingleQuotation(Object obj, String className);
}
